/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;


import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import static javax.persistence.TemporalType.DATE;

/**
 *
 * @author diego
 */
@Entity
public class Funcion implements Serializable {
    
    @Id    
    @Column(name="FUNCION_ID")
    private Integer id ;
    
    @Temporal(DATE)
    private Date fecha;
    
    @Basic
    private long hora; //timestamp
    
    @Basic
    private String descripcion;
    
    @Basic
    private String nombre;
    
    @ManyToOne   
    @JoinColumn(name="EVENTO_ID")
    private Evento evento;    
    
    @OneToMany(mappedBy="funcion")    
    @JoinTable(name="FUNCION_TARIFA",joinColumns={@JoinColumn(name="FUNCION_ID", referencedColumnName="FUNCION_ID")},inverseJoinColumns={@JoinColumn(name="TARIFA_ID",referencedColumnName="TARIFA_ID", unique=true)})
    private Set<Tarifa> tarifas;
    
    @OneToMany(mappedBy="funcion")
    @JoinTable(name="FUNCION_TRANSACCIONVENTAS",joinColumns={@JoinColumn(name="FUNCION_ID", referencedColumnName="FUNCION_ID")},inverseJoinColumns={@JoinColumn(name="TRANSACCIONVENTAS_ID",referencedColumnName="TRANSACCIONVENTAS_ID", unique=true)})
    private Set<TransaccionVentas> transacciones;
    
    @Basic
    private boolean activa;
    
    @ManyToOne
    private Sala sala;
    

    public Funcion() {
    }

    public Funcion(Integer id, Date fecha, long hora, String descripcion, String nombre, Evento unEvento,Sala sala) {
        this.id = id;
        this.fecha = fecha;
        this.hora = hora;
        this.descripcion = descripcion;
        this.nombre = nombre;
        this.evento = unEvento;
        this.tarifas = new HashSet();
        this.transacciones = new HashSet();
        this.activa = true;
        this.sala = sala;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public long getHora() {
        return hora;
    }

    public void setHora(long hora) {
        this.hora = hora;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Evento getUnEvento() {
        return evento;
    }

    public void setUnEvento(Evento unEvento) {
        this.evento = unEvento;
    }

    public Set<Tarifa> getTarifas() {
        return tarifas;
    }

    public void setTarifas(Set<Tarifa> tarifas) {
        this.tarifas = tarifas;
    }

    public Set<TransaccionVentas> getTransacciones() {
        return transacciones;
    }

    public void setTransacciones(Set<TransaccionVentas> transacciones) {
        this.transacciones = transacciones;
    }

    public boolean isActiva() {
        return activa;
    }
    
    public boolean getActiva() {
        return activa;
    }

    public void setActiva(boolean activa) {
        this.activa = activa;
    }

    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    public Sala getSala() {
        return sala;
    }

    public void setSala(Sala sala) {
        this.sala = sala;
    }
    
    
    
   /*
    public void venderTicket(Butaca unaButaca, String nro, Double precio, Usuario unUsuario){
        //Butaca unaButaca, String nro, Double precio, Usuario unUsuario
        Ticket unTicket = new Ticket(this,unaButaca,nro,precio,unUsuario);
        this.butacasVendidas.put(nro, unTicket);
    }
    */
    
    public TransaccionVentas crearTransaccionVenta(){
     //   Date fecha = new Date();        
    //    TransaccionVentas tr = new TransaccionVentas(this,fecha);
        TransaccionVentas tr = new TransaccionVentas();
        return tr;
        
    }
    
    public void agregarTicket(TransaccionVentas unaTransaccion,Funcion unaFuncion, Butaca unaButaca, String nro, Tarifa unaTarifa, Usuario unUsuario){
        unaTransaccion.agregarTicket(unaFuncion, unaButaca, nro, unaTarifa.getUnPrecio(), unUsuario);
    }
    
    public void habilitar(){
        this.setActiva(true);
    }
    
    public void deshabilitar(){
        this.setActiva(false);
    }
    
    public void agregarTarifa(Tarifa unaTarifa){
        this.tarifas.add(unaTarifa);
        
    }
    public int localidadesDisponibles(){
        int localidades = this.sala.capacidad();
        int tickets = 0;
        for (TransaccionVentas tr : this.transacciones) {
            tickets = tickets + tr.ticketsVendidos();
        }                
        return localidades - tickets;
    }
    public boolean localidadesAgotadas(){
        boolean salida = false;
        if(this.localidadesDisponibles() <= 0){
            salida =  true;
        }
        return salida;
    }
    
    @Override
    public String toString(){
        return this.nombre + " " + this.fecha;
    }
}
